import store from '@/store'
import axios from 'axios'
import { Message } from 'element-ui'

// 模块端口映射表
const portMap = { "base": 12088, "health": 12089, "clinic": 12090 }

// 地址配置
/**
 * 地址配置 dev : 192.168.31.93 pro: 43.143.243.229
 * @type {{dev: string, pro: string}}
 */
const url_config = {
  // dev: "192.168.31.120",
  dev: "192.168.31.22",
  // dev: "43.143.243.229",
  // pro: "43.143.243.229"
  // pro: "123.56.122.240",
  pro: "/"
}

const env = process.env.NODE_ENV
const basePath = env === "development" ? url_config.dev : url_config.pro

// 创建
const service = axios.create({
  // 设置 Base Url ，请求url = base url + request url 默认：process.env.VUE_APP_BASE_API
  baseURL: basePath, // 跨域请求时是否需要使用凭证，默认false
  // withCredentials: true,
  // 设置请求超出时间
  // timeout: 20000
  timeout: 100000
})

// request/请求 拦截器
service.interceptors.request.use(// 请求前拦截器
  config => {
    // 获取配置中的请求地址
    const token = store.getters['setting/getToken']
    if (env === "development") {
      // 获取请求地址
      const sysName = config.url.substring(0, config.url.indexOf("/"))
      const port = portMap[sysName]
      config.baseURL = "http://" + basePath + ":" + port + "/"
    }
    // 设置Token到请求列表
    config.headers['Authorization'] = token === undefined ? "Visitor" : token
    return config
  }, // 异常处理器
  error => {
    // 输出异常信息
    return Promise.reject(error)
  })

// response/响应 拦截器
service.interceptors.response.use(// 预处理 response
  response => {
    // 输出响应内容
    const status = response.status
    const reData = response.data
    const reCode = reData.code

    // 处理请求异常
    if (status !== 200) {
      Message({
        message: '请求失败，异常码：' + status, type: 'error', duration: 12 * 1000
      })
      return Promise.reject(new Error('Error'))
    }

    // 处理系统异常
    if (reCode !== 1) {
      const message = reData.message
      Message({
        message: message, type: 'error', duration: 5 * 1000
      })
      return Promise.reject(message)
    }
    return reData
  },

  // 异常处理器
  error => {
    // 输出异常信息
    Message({
      message: error.message, type: 'error', duration: 5 * 1000
    })
    return Promise.reject(error)
  })

export default service
